package 数据结构.栈和队列.栈.链栈;

public class LinkedListStack<E> {
    private Node<E> top; // 栈顶
    private int size;    // 栈的大小

    // 节点类，用于存储数据和下一个节点的引用
    private static class Node<E> {
        E data;
        Node<E> next;

        Node(E data, Node<E> next) {
            this.data = data;
            this.next = next;
        }
    }

    // 构造函数，初始化空栈
    public LinkedListStack() {
        top = null;
        size = 0;
    }

    // 入栈操作
    public void push(E item) {
        top = new Node<>(item, top);
        size++;
    }

    // 出栈操作
    public E pop() {
        if (isEmpty()) {
            throw new IllegalStateException("栈为空");
        }
        E item = top.data;
        top = top.next;
        size--;
        return item;
    }

    // 查看栈顶元素
    public E peek() {
        if (isEmpty()) {
            throw new IllegalStateException("栈为空");
        }
        return top.data;
    }

    // 判断栈是否为空
    public boolean isEmpty() {
        return size == 0;
    }

    // 获取栈的大小
    public int size() {
        return size;
    }

    // 打印栈的所有元素
    public void printStack() {
        Node<E> current = top;
        while (current != null) {
            System.out.print(current.data + " ");
            current = current.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        LinkedListStack<Integer> stack = new LinkedListStack<>();

        // 测试入栈操作
        stack.push(10);
        stack.push(20);
        stack.push(30);

        // 打印栈中的元素
        System.out.println("栈中的元素：");
        stack.printStack(); // 输出：30 20 10

        // 测试查看栈顶元素
        System.out.println("栈顶元素：" + stack.peek()); // 输出：30

        // 测试出栈操作
        System.out.println("弹出元素：" + stack.pop()); // 输出：30

        // 打印栈中的元素
        System.out.println("栈中的元素：");
        stack.printStack(); // 输出：20 10

        // 判断栈是否为空
        System.out.println("栈是否为空：" + stack.isEmpty()); // 输出：false

        // 打印栈的大小
        System.out.println("栈的大小：" + stack.size()); // 输出：2
    }
}


